home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1994-04-20 | 12.0 KB | 373 lines | [TEXT/MEDT] |
- IMPLEMENTATION MODULE Thread;
- (*
- Implementation and Revisions:
- ============================
-
- Author Date Description
- ------ ---- -----------
-
- JT 30/3/94 First implementation (MacMETH_V3.2)
-
- *)
-
-
- FROM SYSTEM IMPORT
- REG, INLINE, VAL, WORD, ADDRESS, SETREG;
-
- CONST
- D0 = 0;
- ThreadTrap = 0ABF2H;
- VAR
- threadsAvailable : BOOLEAN;
-
- (* Thread Manager routines *)
- PROCEDURE CreateThreadPool(threadStyle: ThreadStyle; numToCreate: INTEGER; stackSize: Size):OSErr;
-
- PROCEDURE TBCreateThreadPool(threadStyle: ThreadStyle;
- numToCreate: INTEGER;
- stackSize: Size ):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00501H);
- RETURN TBCreateThreadPool(threadStyle, numToCreate, stackSize);
- END CreateThreadPool;
-
-
- PROCEDURE GetFreeThreadCount(threadStyle: ThreadStyle; VAR freeCount: INTEGER):OSErr;
- PROCEDURE TBGetFreeThreadCount( threadStyle: ThreadStyle;
- VAR freeCount: INTEGER):OSErr ; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00402H);
- RETURN TBGetFreeThreadCount(threadStyle, freeCount);
- END GetFreeThreadCount;
-
-
- PROCEDURE GetSpecificFreeThreadCount ( threadStyle: ThreadStyle; stackSize: Size; VAR freeCount: INTEGER):OSErr;
- PROCEDURE TBGetSpecificFreeThreadCount ( threadStyle: ThreadStyle;
- stackSize: Size;
- VAR freeCount: INTEGER ):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00615H);
- RETURN TBGetSpecificFreeThreadCount(threadStyle, stackSize, freeCount);
- END GetSpecificFreeThreadCount;
-
-
- PROCEDURE GetDefaultThreadStackSize(threadStyle: ThreadStyle; VAR stackSize: Size):OSErr;
- PROCEDURE TBGetDefaultThreadStackSize( threadStyle: ThreadStyle;
- VAR stackSize: Size ):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00413H);
- RETURN TBGetDefaultThreadStackSize(threadStyle, stackSize);
- END GetDefaultThreadStackSize;
-
-
- PROCEDURE ThreadCurrentStackSpace(thread: ThreadID; VAR freeStack: LONGINT):OSErr;
- PROCEDURE TBThreadCurrentStackSpace(thread: ThreadID; VAR freeStack: LONGINT):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00414H);
- RETURN TBThreadCurrentStackSpace(thread, freeStack);
- END ThreadCurrentStackSpace;
-
-
- PROCEDURE NewThread(threadStyle: ThreadStyle; threadEntry: ThreadEntryProcPtr; threadParam: LONGINT; stackSize: Size; options: ThreadOptions; threadResult: LongIntPtr; VAR threadMade: ThreadID):OSErr;
- PROCEDURE TBNewThread(threadStyle: ThreadStyle;
- threadEntry: ThreadEntryProcPtr;
- threadParam: LONGINT;
- stackSize: Size;
- options: ThreadOptions;
- threadResult: LongIntPtr;
- VAR threadMade: ThreadID):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00E03H);
- RETURN TBNewThread(threadStyle, threadEntry, threadParam,
- stackSize, options, threadResult, threadMade);
- END NewThread;
-
-
- PROCEDURE DisposeThread(threadToDump: ThreadID; threadResult: LONGINT; recycleThread: BOOLEAN):OSErr;
- PROCEDURE TBDisposeThread(threadToDump: ThreadID;
- threadResult: LONGINT;
- recycleThread: BOOLEAN ):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00504H);
- RETURN TBDisposeThread(threadToDump, threadResult, recycleThread);
- END DisposeThread;
-
-
- PROCEDURE YieldToThread(suggestedThread: ThreadID):OSErr;
- PROCEDURE TBYieldToThread(suggestedThread: ThreadID):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00205H);
- RETURN TBYieldToThread(suggestedThread);
- END YieldToThread;
-
-
- PROCEDURE YieldToAnyThread():OSErr;
- PROCEDURE TBYieldToAnyThread():OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 042A7H,0303CH,00205H);
- RETURN TBYieldToAnyThread();
- END YieldToAnyThread;
-
-
- PROCEDURE GetCurrentThread(VAR currentThreadID: ThreadID):OSErr;
- PROCEDURE TBGetCurrentThread(VAR currentThreadID: ThreadID):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00206H);
- RETURN TBGetCurrentThread(currentThreadID);
- END GetCurrentThread;
-
-
- PROCEDURE GetThreadState(threadToGet: ThreadID; VAR threadState: ThreadState):OSErr;
- PROCEDURE TBGetThreadState(threadToGet: ThreadID; VAR threadState: ThreadState):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00407H);
- RETURN TBGetThreadState(threadToGet, threadState);
- END GetThreadState;
-
-
- PROCEDURE SetThreadState(threadToSet: ThreadID; newState: ThreadState; suggestedThread: ThreadID):OSErr;
- PROCEDURE TBSetThreadState(threadToSet: ThreadID;
- newState: ThreadState;
- suggestedThread: ThreadID):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00508H);
- RETURN TBSetThreadState(threadToSet, newState, suggestedThread);
- END SetThreadState;
-
-
- PROCEDURE SetThreadStateEndCritical(threadToSet: ThreadID; newState: ThreadState; suggestedThread: ThreadID):OSErr;
- PROCEDURE TBSetThreadStateEndCritical(threadToSet: ThreadID;
- newState: ThreadState;
- suggestedThread: ThreadID):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00512H);
- RETURN TBSetThreadStateEndCritical(threadToSet, newState, suggestedThread);
- END SetThreadStateEndCritical;
-
-
- PROCEDURE SetThreadScheduler(threadScheduler: ThreadSchedulerProcPtr):OSErr;
- PROCEDURE TBSetThreadScheduler(threadScheduler: ThreadSchedulerProcPtr):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00209H);
- RETURN TBSetThreadScheduler(threadScheduler);
- END SetThreadScheduler;
-
-
- PROCEDURE SetThreadSwitcher(thread: ThreadID; threadSwitcher: ThreadSwitchProcPtr; switchProcParam: LONGINT; inOrOut: BOOLEAN):OSErr;
- PROCEDURE TBSetThreadSwitcher(thread: ThreadID;
- threadSwitcher: ThreadSwitchProcPtr;
- switchProcParam: LONGINT;
- inOrOut: BOOLEAN ):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,0070AH);
- RETURN TBSetThreadSwitcher(thread, threadSwitcher, switchProcParam, inOrOut);
- END SetThreadSwitcher;
-
-
- PROCEDURE SetThreadTerminator(thread: ThreadID; threadTerminator: ThreadTerminationProcPtr; terminationProcParam: LONGINT):OSErr;
- PROCEDURE TBSetThreadTerminator(thread: ThreadID;
- threadTerminator: ThreadTerminationProcPtr;
- terminationProcParam: LONGINT):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00611H);
- RETURN TBSetThreadTerminator(thread, threadTerminator, terminationProcParam);
- END SetThreadTerminator;
-
-
- PROCEDURE ThreadBeginCritical():OSErr;
- PROCEDURE TBThreadBeginCritical():OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,0000BH);
- RETURN TBThreadBeginCritical();
- END ThreadBeginCritical;
-
-
- PROCEDURE ThreadEndCritical():OSErr;
- PROCEDURE TBThreadEndCritical():OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,0000CH);
- RETURN TBThreadEndCritical();
- END ThreadEndCritical;
-
-
- PROCEDURE SetDebuggerNotificationProcs ( notifyNewThread: DebuggerNewThreadProcPtr;
- notifyDisposeThread: DebuggerDisposeThreadProcPtr;
- notifyThreadScheduler: DebuggerThreadSchedulerProcPtr ):OSErr;
- PROCEDURE TBSetDebuggerNotificationProcs (notifyNewThread: DebuggerNewThreadProcPtr;
- notifyDisposeThread: DebuggerDisposeThreadProcPtr;
- notifyThreadScheduler: DebuggerThreadSchedulerProcPtr ):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,0060DH);
- RETURN TBSetDebuggerNotificationProcs (notifyNewThread,
- notifyDisposeThread,
- notifyThreadScheduler);
- END SetDebuggerNotificationProcs;
-
-
- PROCEDURE GetThreadCurrentTaskRef ( VAR threadTRef: ThreadTaskRef ):OSErr;
- PROCEDURE TBGetThreadCurrentTaskRef ( VAR threadTRef: ThreadTaskRef ):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,0020EH);
- RETURN TBGetThreadCurrentTaskRef(threadTRef);
- END GetThreadCurrentTaskRef;
-
-
- PROCEDURE GetThreadStateGivenTaskRef ( threadTRef: ThreadTaskRef; threadToGet: ThreadID; VAR threadState: ThreadState ):OSErr;
- PROCEDURE TBGetThreadStateGivenTaskRef ( threadTRef: ThreadTaskRef;
- threadToGet: ThreadID;
- VAR threadState: ThreadState ):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,0060FH);
- RETURN TBGetThreadStateGivenTaskRef (threadTRef, threadToGet, threadState);
- END GetThreadStateGivenTaskRef;
-
-
- PROCEDURE SetThreadReadyGivenTaskRef ( threadTRef: ThreadTaskRef; threadToSet: ThreadID ):OSErr;
- PROCEDURE TBSetThreadReadyGivenTaskRef (threadTRef: ThreadTaskRef;
- threadToSet: ThreadID ):OSErr; CODE ThreadTrap;
-
- BEGIN
- INLINE( 0303CH,00410H);
- RETURN TBSetThreadReadyGivenTaskRef (threadTRef, threadToSet);
- END SetThreadReadyGivenTaskRef;
-
- PROCEDURE ThreadsAvailable( ) : BOOLEAN;
- BEGIN
- RETURN threadsAvailable;
- END ThreadsAvailable;
-
- TYPE
- TrapType = ( OSTrap, ToolTrap );
- TypeID = ( set, wrd );
- OSType = ARRAY[1..4] OF CHAR;
-
- WordTYPE = RECORD (* 16 bits *)
- CASE : TypeID OF
- set : s : BITSET;
- | wrd : w : WORD;
- END(*CASE*);
- END(*RECORD*);
- CONST
- A0 = 8;
- InitGrafTRAP = 0A86EH;
- GestaltTRAP = 0A1ADH;
- UnimplTRAP = 0009FH;
-
- PROCEDURE NGetTrapAddress(trapNum: WORD; trapType: TrapType): ADDRESS;
- (* see Inside Mac IV-234. (AI 5.2.88)
- trap nr from MDS 2.0 Disk 3/3 File: Traps.txt *)
- (* only for 128k Rom traps ! *)
- VAR adr: ADDRESS;
- BEGIN
- SETREG(D0,LONG(trapNum));
- IF trapType = OSTrap THEN
- INLINE(0A346H); (* Bit 9 set; Bit 10 clear *)
- ELSE
- INLINE(0A746H); (* Bit 9 set; Bit 10 set *);
- END;
- adr:= REG(A0);
- RETURN adr;
- END NGetTrapAddress;
-
-
- PROCEDURE NumToolboxTraps(): WORD;
- BEGIN
- IF NGetTrapAddress(VAL(CARDINAL,InitGrafTRAP),ToolTrap) =
- NGetTrapAddress(VAL(CARDINAL,0AA6EH ),ToolTrap) THEN
- RETURN 0200H;
- ELSE
- RETURN 0400H;
- END(*IF*);
- END NumToolboxTraps;
-
-
- PROCEDURE BitAND( a, b: WORD ): WORD;
- VAR
- r, x, y : WordTYPE;
- BEGIN
- x.w:= a;
- y.w:= b;
- r.s:= ( x.s * y.s );
- RETURN r.w;
- END BitAND;
-
-
- PROCEDURE GetTrapType(theTrap: WORD): TrapType;
- CONST
- TrapMask = 0800H;
- BEGIN
- IF BitAND(theTrap,TrapMask) > VAL(WORD,0) THEN
- RETURN ToolTrap;
- ELSE
- RETURN OSTrap;
- END(*IF*);
- END GetTrapType;
-
-
- PROCEDURE TrapAvailable(theTrap: WORD): BOOLEAN;
- CONST
- TrapOffset = 07FFH;
- VAR
- tType: TrapType;
- BEGIN
- tType := GetTrapType(theTrap);
- IF tType = ToolTrap THEN
- theTrap := BitAND(theTrap, TrapOffset);
- IF theTrap >= NumToolboxTraps() THEN
- theTrap:= UnimplTRAP;
- END(*IF*);
- END(*IF*);
- RETURN ( NGetTrapAddress(theTrap , tType ) <>
- NGetTrapAddress(UnimplTRAP, ToolTrap) );
- END TrapAvailable;
- PROCEDURE GestaltAvailable(): BOOLEAN;
- (* Should be available in systems >= 6.0.4, see IM VI 3-4 *)
- BEGIN
- RETURN TrapAvailable( GestaltTRAP );
- END GestaltAvailable;
-
-
- PROCEDURE Gestalt( selector: OSType; VAR response: LONGINT): OSErr;
- BEGIN
- SETREG(D0,selector); INLINE (GestaltTRAP);
- response := REG(A0);
- RETURN VAL(INTEGER,REG(D0))
- END Gestalt;
-
- PROCEDURE ShortGestalt(selector: OSType): INTEGER;
- VAR response: LONGINT; err: OSErr;
- BEGIN
- err := Gestalt(selector,response);
- IF err = 0 THEN RETURN SHORT(response) ELSE RETURN 0 END;
- END ShortGestalt;
-
-
-
- BEGIN
- threadsAvailable := GestaltAvailable();
- IF threadsAvailable THEN
- threadsAvailable := gestaltThreadMgrPresent
- IN VAL(BITSET, ShortGestalt(gestaltThreadMgrAttr));
- END;(*IF*)
- END Thread.